Package org.python.pydev.editor.codecompletion

Source Code of org.python.pydev.editor.codecompletion.PyCompletionPresentationUpdater

/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on Jul 13, 2006
* @author Fabio
*/
package org.python.pydev.editor.codecompletion;

import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.ITextViewerExtension2;
import org.eclipse.jface.text.ITextViewerExtension5;
import org.eclipse.jface.text.Region;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.python.pydev.editor.codefolding.PySourceViewer;

public class PyCompletionPresentationUpdater {

    private StyleRange fRememberedStyleRange;

    private static Color getForegroundColor(StyledText text) {
        return Display.getDefault().getSystemColor(SWT.COLOR_RED);
    }

    private static Color getBackgroundColor(StyledText text) {
        return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW);
    }

    public PyCompletionPresentationUpdater() {
    }

    public void repairPresentation(ITextViewer viewer) {
        if (fRememberedStyleRange != null) {
            if (viewer instanceof ITextViewerExtension2) {
                // attempts to reduce the redraw area
                ITextViewerExtension2 viewer2 = (ITextViewerExtension2) viewer;

                if (viewer instanceof ITextViewerExtension5) {

                    ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
                    IRegion modelRange = extension.widgetRange2ModelRange(new Region(fRememberedStyleRange.start,
                            fRememberedStyleRange.length));
                    if (modelRange != null)
                        viewer2.invalidateTextPresentation(modelRange.getOffset(), modelRange.getLength());

                } else {
                    viewer2.invalidateTextPresentation(fRememberedStyleRange.start
                            + viewer.getVisibleRegion().getOffset(), fRememberedStyleRange.length);
                }

            } else
                viewer.invalidateTextPresentation();
        }
        if (viewer instanceof PySourceViewer) {
            PySourceViewer pySourceViewer = (PySourceViewer) viewer;
            pySourceViewer.setInToggleCompletionStyle(false);
        }
    }

    public void updateStyle(ITextViewer viewer, int initialOffset, int len) {

        StyledText text = viewer.getTextWidget();
        if (text == null || text.isDisposed())
            return;

        int widgetCaret = text.getCaretOffset();

        int modelCaret = 0;
        if (viewer instanceof ITextViewerExtension5) {
            ITextViewerExtension5 extension = (ITextViewerExtension5) viewer;
            modelCaret = extension.widgetOffset2ModelOffset(widgetCaret);
        } else {
            IRegion visibleRegion = viewer.getVisibleRegion();
            modelCaret = widgetCaret + visibleRegion.getOffset();
        }

        if (modelCaret >= initialOffset + len) {
            repairPresentation(viewer);
            return;
        }

        int offset = widgetCaret;
        int length = initialOffset + len - modelCaret;

        Color foreground = getForegroundColor(text);
        Color background = getBackgroundColor(text);

        StyleRange range = text.getStyleRangeAtOffset(offset);
        int fontStyle = range != null ? range.fontStyle : SWT.NORMAL;

        repairPresentation(viewer);
        fRememberedStyleRange = new StyleRange(offset, length, foreground, background, fontStyle);
        if (range != null) {
            fRememberedStyleRange.strikeout = range.strikeout;
            fRememberedStyleRange.underline = range.underline;
        }

        // http://dev.eclipse.org/bugs/show_bug.cgi?id=34754
        try {
            if (viewer instanceof PySourceViewer) {
                PySourceViewer pySourceViewer = (PySourceViewer) viewer;
                pySourceViewer.setInToggleCompletionStyle(true);
            }
            text.setStyleRange(fRememberedStyleRange);
        } catch (IllegalArgumentException x) {
            // catching exception as offset + length might be outside of the text widget
            fRememberedStyleRange = null;
        }
    }

}
TOP

Related Classes of org.python.pydev.editor.codecompletion.PyCompletionPresentationUpdater

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.